package org.study.module.hadoop;

import org.study.module.common.ModuleCommon;

import java.util.ArrayList;
import java.util.List;

/**
 * HDFS安装shell命令
 *  启动命令： start-dfs.sh
 *  停止命令： stop-dfs.sh
 * "启动后，可以访问 http://localhost:9870 查看HDFS管理界面"
 */
public class HDFSShell {

    /**
     * HDFS配置： 数据节点和名称节点在同一个机器上
     * @param installPath 安装目录
     * @return
     */
    public static List<String> hdfsSiteOne(String installPath) {
        List<String> configs = new ArrayList<>();
        installPath += "/hadoop/";
        configs.add("cat > $HADOOP_HOME/etc/hadoop/hdfs-site.xml << EOF");
        ModuleCommon.addConfigHead(configs);
        ModuleCommon.addProperty("dfs.replication","1",configs);
        ModuleCommon.addProperty("dfs.namenode.name.dir",installPath+"hdfs/name",configs);
        ModuleCommon.addProperty("dfs.datanode.data.dir",installPath+"hdfs/data",configs);
        ModuleCommon.addConfigEnd(configs);
        configs.add("EOF");
        return configs;
    }

    /**
     * 多节点安装
     * @param installPath 安装路径
     * @param nameNodeHost 名称节点，如：$MASTER_HOST:9868
     */

    public static List<String> hdfsSite(String installPath,String nameNodeHost) {
        List<String> configs = new ArrayList<>();
        installPath += "/hadoop/";
        configs.add("cat > $HADOOP_HOME/etc/hadoop/hdfs-site.xml << EOF");
        ModuleCommon.addConfigHead(configs);
        ModuleCommon.addProperty("dfs.replication","1",configs);
        ModuleCommon.addProperty("dfs.namenode.name.dir",installPath+"hdfs/name",configs);
        ModuleCommon.addProperty("dfs.datanode.data.dir",installPath+"hdfs/data",configs);
        ModuleCommon.addProperty("dfs.namenode.secondary.http-address",nameNodeHost,configs);
        ModuleCommon.addConfigEnd(configs);
        configs.add("EOF");
        return configs;
    }

    public static List<String> hdfsSiteHA(String installPath,String nameNodeHost,String clusterName,String nns) {
        List<String> configs = new ArrayList<>();
        installPath += "/hadoop/";
        configs.add("cat > $HADOOP_HOME/etc/hadoop/hdfs-site.xml << EOF");
        ModuleCommon.addConfigHead(configs);
        configs.add("    <!-- 集群服务名 -->");
        ModuleCommon.addProperty("dfs.nameservices",clusterName,configs);
        configs.add("    <!-- NameNode节点列表 -->");
        ModuleCommon.addProperty("dfs.ha.namenodes."+clusterName,nns,configs);
        String[] ns = nns.split(",");
        for(String nn : ns){
            configs.add("    <!-- "+nn+"地址 -->");
            ModuleCommon.addProperty("dfs.namenode.rpc-address."+clusterName+"."+nn,nn+":9000",configs);
            ModuleCommon.addProperty("dfs.namenode.http-address."+clusterName+"."+nn,nn+":9870",configs);
        }
        configs.add("    <!-- JournalNode配置 -->");
        ModuleCommon.addProperty("dfs.namenode.shared.edits.dir","qjournal://nn1:8485;nn2:8485;jn1:8485/mycluster",configs);
        ModuleCommon.addProperty("dfs.journalnode.edits.dir",installPath+"journal",configs);
        configs.add("    <!-- 隔离机制 -->");
        ModuleCommon.addProperty("dfs.ha.fencing.methods","sshfence",configs);
        ModuleCommon.addProperty("dfs.ha.fencing.ssh.private-key-files","/home/hadoop/.ssh/id_rsa",configs);
        configs.add("    <!-- 自动故障转移 -->");
        ModuleCommon.addProperty("dfs.ha.automatic-failover.enabled","true",configs);
        configs.add("    <!-- 副本数 -->");
        ModuleCommon.addProperty("dfs.replication","3",configs);
        ModuleCommon.addProperty("dfs.namenode.name.dir",installPath+"hdfs/name",configs);
        ModuleCommon.addProperty("dfs.datanode.data.dir",installPath+"hdfs/data",configs);
        ModuleCommon.addProperty("dfs.namenode.secondary.http-address",nameNodeHost,configs);
        ModuleCommon.addConfigEnd(configs);
        configs.add("EOF");
        return configs;
    }



}
